在初期開發這個作品時,因為採取 「邊做邊驗證」 的策略,並沒有預先對程式碼進行模組化拆分。當時的專案架構如下:
| 檔案 | 主要功能 | 程式碼行數 |
|---|---|---|
db.js |
IndexedDB 資料庫處理 | 86 行 |
i18n.js |
多國語系(邏輯與字典) | 737 行 |
theme.js |
主題切換樣式 | 32 行 |
all.js |
核心邏輯(除 DB、語系、主題外的所有 JS) | 1870 行 |
當功能開發完成、回過頭 Review 程式碼時,雖然當初邊寫有邊留註解,但面對近兩千行的單一檔案,閱讀起來依然相當痛苦。
特別是在時間碎片化的情況下,很難拆解成小模組進行區域性檢查;有時候檢查到一半被其他事情打斷,下次再回到專案時又得重新梳理邏輯。但是自己挖的坑,自己填補起來,才是個負責任的大人。為了未來的維護性與可讀性,重構吧!
這次重構主要針對程式碼量龐大的 all.js 進行模組化拆分。
另外,針對 i18n.js,會將 「語系切換邏輯」 與 「字典資料」 分開成不同檔案。未來如果需要新增其他語系,只需要擴充字典檔即可,維護起來更加單純。
js/
├── config
│ ├── i18n.js
│ ├── locales/
│ │ ├── zh-TW.js
│ │ ├── en.js
│ │ ├── ja.js
│ └── └──index.js
│
├── all.js
├── data.js
├── db.js
├── dom.js
├── events.js
├── render.js
├── state.js
├── task.js
├── theme.js
├── timer.js
├── utils.js
└── privacy.js
| 檔案 | 主要功能 | 程式碼行數 |
|---|---|---|
| config/i18n.js | 語系切換與初始化邏輯 | 126 行 |
| locales/zh-TW.js | 繁體中文對照字典 | 247 行 |
| locales/en.js | 英文對照字典 | 260 行 |
| locales/ja.js | 日文對照字典 | 254 行 |
| locales/index.js | 集合與匯出語系字典檔 | 14 行 |
| all.js | 應用程式主要進入點 (Main Entry) | 18 行 |
| data.js | 資料結構整理 | 277 行 |
| db.js | IndexedDB 操作邏輯 | 79 行 |
| dom.js | DOM 元素選取與快取管理 | 60 行 |
| events.js | 事件監聽器綁定與指派 | 163 行 |
| render.js | 畫面渲染與 UI 畫面重繪 | 529 行 |
| state.js | 應用程式狀態管理 (State) | 50 行 |
| task.js | 任務新增、修改與刪除邏輯 | 362 行 |
| theme.js | 深淺色主題切換邏輯 | 36 行 |
| timer.js | 計時器核心倒數與狀態邏輯 | 274 行 |
| utils.js | 通用工具函式 (Format, Validation 等) | 134 行 |
| privacy.js | 切換隱私權政策的語系 | 25 行 |
有時候覺得「重構程式碼」甚至比「寫新功能」還要辛苦。因為只要稍微不注意,原本運作正常的機能就可能因為模組作用域或載入順序問題而壞掉,很容易感到挫折。
但當看到重構完成、所有程式碼與檔案都被「擺放得整整齊齊」的那一刻,感到很清爽。
剛開始開發時,目標很單純:「只要能把功能做出來、跑得順就好。」雖然因為是個人獨立開發,初期沒有太講究架構,但很開心自己最後不僅完成了作品,還跨出了重構的這一步。
經歷了這次經驗,在未來的開發歷程中,我會嘗試養成邊寫邊整理,朝向寫出高可讀性、高維護性程式碼的方向繼續前進。